/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladores;

import controladores.exceptions.NonexistentEntityException;
import entity.ComentarioEntity;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import entity.UsuarioEntity;
import entity.ObjetoEntity;
import gestionYClasesDeNegocio.Objeto;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author Gaston
 */
public class ComentarioEntityJpaController implements Serializable
{

    public ComentarioEntityJpaController(EntityManagerFactory emf)
    {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager()
    {
        return emf.createEntityManager();
    }

    public void create(ComentarioEntity comentarioEntity)
    {
        EntityManager em = null;
        try
        {
            em = getEntityManager();
            em.getTransaction().begin();
            UsuarioEntity usuario = comentarioEntity.getUsuario();
            if (usuario != null)
            {
                usuario = em.getReference(usuario.getClass(), usuario.getId());
                comentarioEntity.setUsuario(usuario);
            }
            ObjetoEntity objeto = comentarioEntity.getObjeto();
            if (objeto != null)
            {
                objeto = em.getReference(objeto.getClass(), objeto.getId());
                comentarioEntity.setObjeto(objeto);
            }
            em.persist(comentarioEntity);
            if (usuario != null)
            {
                usuario.getComentarioEntityCollection().add(comentarioEntity);
                usuario = em.merge(usuario);
            }
            if (objeto != null)
            {
                objeto.getComentarioEntityCollection().add(comentarioEntity);
                objeto = em.merge(objeto);
            }
            em.getTransaction().commit();
        } finally
        {
            if (em != null)
            {
                em.close();
            }
        }
    }

    public void edit(ComentarioEntity comentarioEntity) throws NonexistentEntityException, Exception
    {
        EntityManager em = null;
        try
        {
            em = getEntityManager();
            em.getTransaction().begin();
            ComentarioEntity persistentComentarioEntity = em.find(ComentarioEntity.class, comentarioEntity.getId());
            UsuarioEntity usuarioOld = persistentComentarioEntity.getUsuario();
            UsuarioEntity usuarioNew = comentarioEntity.getUsuario();
            ObjetoEntity objetoOld = persistentComentarioEntity.getObjeto();
            ObjetoEntity objetoNew = comentarioEntity.getObjeto();
            if (usuarioNew != null)
            {
                usuarioNew = em.getReference(usuarioNew.getClass(), usuarioNew.getId());
                comentarioEntity.setUsuario(usuarioNew);
            }
            if (objetoNew != null)
            {
                objetoNew = em.getReference(objetoNew.getClass(), objetoNew.getId());
                comentarioEntity.setObjeto(objetoNew);
            }
            comentarioEntity = em.merge(comentarioEntity);
            if (usuarioOld != null && !usuarioOld.equals(usuarioNew))
            {
                usuarioOld.getComentarioEntityCollection().remove(comentarioEntity);
                usuarioOld = em.merge(usuarioOld);
            }
            if (usuarioNew != null && !usuarioNew.equals(usuarioOld))
            {
                usuarioNew.getComentarioEntityCollection().add(comentarioEntity);
                usuarioNew = em.merge(usuarioNew);
            }
            if (objetoOld != null && !objetoOld.equals(objetoNew))
            {
                objetoOld.getComentarioEntityCollection().remove(comentarioEntity);
                objetoOld = em.merge(objetoOld);
            }
            if (objetoNew != null && !objetoNew.equals(objetoOld))
            {
                objetoNew.getComentarioEntityCollection().add(comentarioEntity);
                objetoNew = em.merge(objetoNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex)
        {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0)
            {
                Integer id = comentarioEntity.getId();
                if (findComentarioEntity(id) == null)
                {
                    throw new NonexistentEntityException("The comentarioEntity with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally
        {
            if (em != null)
            {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws NonexistentEntityException
    {
        EntityManager em = null;
        try
        {
            em = getEntityManager();
            em.getTransaction().begin();
            ComentarioEntity comentarioEntity;
            try
            {
                comentarioEntity = em.getReference(ComentarioEntity.class, id);
                comentarioEntity.getId();
            } catch (EntityNotFoundException enfe)
            {
                throw new NonexistentEntityException("The comentarioEntity with id " + id + " no longer exists.", enfe);
            }
            UsuarioEntity usuario = comentarioEntity.getUsuario();
            if (usuario != null)
            {
                usuario.getComentarioEntityCollection().remove(comentarioEntity);
                usuario = em.merge(usuario);
            }
            ObjetoEntity objeto = comentarioEntity.getObjeto();
            if (objeto != null)
            {
                objeto.getComentarioEntityCollection().remove(comentarioEntity);
                objeto = em.merge(objeto);
            }
            em.remove(comentarioEntity);
            em.getTransaction().commit();
        } finally
        {
            if (em != null)
            {
                em.close();
            }
        }
    }

    public List<ComentarioEntity> findComentarioEntityEntities()
    {
        return findComentarioEntityEntities(true, -1, -1);
    }

    public List<ComentarioEntity> findComentarioEntityEntities(int maxResults, int firstResult)
    {
        return findComentarioEntityEntities(false, maxResults, firstResult);
    }

    private List<ComentarioEntity> findComentarioEntityEntities(boolean all, int maxResults, int firstResult)
    {
        EntityManager em = getEntityManager();
        try
        {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(ComentarioEntity.class));
            Query q = em.createQuery(cq);
            if (!all)
            {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally
        {
            em.close();
        }
    }

    public ComentarioEntity findComentarioEntity(Integer id)
    {
        EntityManager em = getEntityManager();
        try
        {
            return em.find(ComentarioEntity.class, id);
        } finally
        {
            em.close();
        }
    }

    public int getComentarioEntityCount()
    {
        EntityManager em = getEntityManager();
        try
        {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<ComentarioEntity> rt = cq.from(ComentarioEntity.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally
        {
            em.close();
        }
    }

    public List<ComentarioEntity> buscarComentarios(ObjetoEntity obj)
    {
        int id = obj.getId();
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("SELECT c FROM ComentarioEntity c WHERE c.objeto = :id");
            q.setParameter("id", obj);
            List<ComentarioEntity> vec = q.getResultList();
            return vec;
        }
        catch(Exception e)
        {
            System.out.println(e);
            
        } finally {
            em.close();
        }
        return null;
    }
    
}
